package br.org.game.nio.core.tcp;

import java.applet.Applet;
import java.awt.Event;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

public class ClienteCall extends Applet {

	private static final long serialVersionUID = 1L;

	public static final int DEFAULT_PORT = 1234;

	public Socket socketClient;
	private Reader reader;

	public TextArea outputArea;
	public TextField inputArea, nomefield;

	public PrintStream outputStream;
	public String name;

	@Override
	public void init() {
		outputArea = new TextArea(20, 45);
		inputArea = new TextField(45);
		nomefield = new TextField(10);

		// Tela da Applet
		add(new Label("MiniChat usando conexao (Socket TCP)"));
		add(new Label("Nome do usuario"));
		add(nomefield);
		add(outputArea);
		add(new Label("Digite uma mensagem e pressione ENTER"));
		add(inputArea);
		resize(550, 445);

		try {

			// Cria um socket cliente passando o endereco e a porta do servidor
			socketClient = new Socket("localhost", DEFAULT_PORT);

			reader = new Reader(this, outputArea);

			outputStream = new PrintStream(socketClient.getOutputStream()); 

			// Define prioridades desiguais para que o console seja compartilhado
			// de forma efetiva.
			reader.setPriority(3);

			reader.start();

		} catch (IOException e) {
			System.err.println(e);
		}
	}

	@Override
	public boolean handleEvent(Event evt) {
		if (evt.target == inputArea) {

			char c = (char) evt.key;

			// Vigia se o usuario pressiona a tecla ENTER.
			// Isso permite saber a mensagem esta pronta para ser enviada!
			if (c == '\n') {

				String line = inputArea.getText();

				name = nomefield.getText();

				// out.println(name + ">" + line);

				outputStream.print(line.trim());

				inputArea.setText("");
				// Envia a mensagem, mas adiciona o nome do usuario a ela para que os
				// outros clientes saibam quem a enviou.
				return true;
			}
		}
		return false;
	}
}

/**
 * A classe Reader le a entrada do soquete e atualiza a OutputArea com as novas mensagens.
 */
class Reader extends Thread {

	private ClienteCall clientCall;
	private TextArea outputArea;

	public Reader(ClienteCall clientCall, TextArea outputArea) {
		this.clientCall = clientCall;
		this.outputArea = outputArea;
	}

	@Override
	public void run() {
		try {
			BufferedInputStream in = new BufferedInputStream(clientCall.socketClient.getInputStream());
			while (true) {
				byte[] bytes = new byte[4];

				in.read(bytes);

				String string = new String(bytes);

				outputArea.append(string);
			}
		} catch (IOException e) {
			System.out.println("Reader:" + e);
		}
	}

}
